﻿/*   
    Copyright (C) 2009 Galaktika Corporation ZAO

    This file is a part of Galaktika.BusinessMonitor
 
    Galaktika.BusinessMonitor is a free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
      
    You should have received a copy of the GNU General Public License
    along with Galaktika.BusinessMonitor.  If not, see <http://www.gnu.org/licenses/>.
  
    If GPL v.3 is not suitable for your products or company,
    Galaktika Corp provides Galaktika.BusinessMonitor under a flexible commercial license
    designed to meet your specific usage and distribution requirements.
    If you have already obtained a commercial license from Galaktika Corp,
    you can use this file under those license terms.
*/

using System;
using System.Collections.Generic;
using System.Threading;

namespace Galaktika.BI.Silverlight.ClientApp.Services
{
    internal static class StatusBarManager
    {
        static StatusBarManager()
        {
            Thread plannerThread = new Thread(new ThreadStart(MainLoop));
            plannerThread.Name = "Status bar main loop";
            plannerThread.IsBackground = true;
            plannerThread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture;
            plannerThread.Start();
        }

        static AutoResetEvent m_MainLoop = new AutoResetEvent(false);
        static Queue<Action> m_Queue = new Queue<Action>();
        static void MainLoop()
        {
            do
            {
                m_MainLoop.WaitOne();
                while (m_Queue.Count > 0)
                {
                    Action a;
                    lock (m_Queue)
                    {
                        a = m_Queue.Dequeue();
                    }
                    Dispatcher.BeginInvoke(a);
                }
            } while (true);

        }

        internal static void SetBarCount(int count)
        {
            if (Bar != null && Dispatcher != null)
            {
                lock (m_Queue)
                {
                    m_Queue.Enqueue(() =>
                    {
                        Bar.Value = Bar.Maximum - count;
                    });
                }
                m_MainLoop.Set();
            }
        }

        internal static void SetBarMaximum(int maximum)
        {
            if (Bar != null && Dispatcher != null)
            {
                lock (m_Queue)
                {
                    m_Queue.Enqueue(() =>
                    {
                        Bar.Maximum = Math.Max(Bar.Maximum, maximum);
                    });
                }
                m_MainLoop.Set();
            }
        }

        internal static void SetBarEmpty()
        {
            if (Bar != null && Dispatcher != null)
            {
                lock (m_Queue)
                {
                    m_Queue.Enqueue(() =>
                    {
                        Bar.Maximum = 1.0;
                        Bar.Value = 0.0;
                    });
                }
                m_MainLoop.Set();
            }
        }

        internal static System.Windows.Controls.ProgressBar Bar;
        internal static System.Windows.Threading.Dispatcher Dispatcher;
    }
}
